{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Cruise control\n",
    "\n",
    "Richard M. Murray and Karl J. Åström  \n",
    "17 Jun 2019\n",
    "\n",
    "The cruise control system of a car is a common feedback system encountered in everyday life. The system attempts to maintain a constant velocity in the presence of disturbances primarily caused by changes in the slope of a road. The controller compensates for these unknowns by measuring the speed of the car and adjusting the throttle appropriately.\n",
    "\n",
    "This notebook explores the dynamics and control of the cruise control system, following the material presenting in Feedback Systems by Astrom and Murray.  A nonlinear model of the vehicle dynamics is used, with both state space and frequency domain control laws.  The process model is presented in Section 1, and a controller based on state feedback is discussed in Section 2, where we also add integral action to the controller. In Section 3 we explore the behavior with PI control including the effect of actuator saturation and how it is avoided by windup protection.  Different methods of constructing control systems are shown, all using the InputOutputSystem class (and subclasses)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from math import pi\n",
    "import control as ct"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Process Model\n",
    "\n",
    "### Vehicle Dynamics\n",
    "\n",
    "To develop a mathematical model we start with a force balance for the car body. Let $v$ be the speed of the car, $m$ the total mass (including passengers), $F$ the force generated by the contact of the wheels with the road, and $F_d$ the disturbance force due to gravity, friction, and aerodynamic drag."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def vehicle_update(t, x, u, params={}):\n",
    "    \"\"\"Vehicle dynamics for cruise control system.\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    x : array\n",
    "         System state: car velocity in m/s\n",
    "    u : array\n",
    "         System input: [throttle, gear, road_slope], where throttle is\n",
    "         a float between 0 and 1, gear is an integer between 1 and 5,\n",
    "         and road_slope is in rad.\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    float\n",
    "        Vehicle acceleration\n",
    "\n",
    "    \"\"\"\n",
    "    from math import copysign, sin\n",
    "    sign = lambda x: copysign(1, x)         # define the sign() function\n",
    "    \n",
    "    # Set up the system parameters\n",
    "    m = params.get('m', 1600.)              # vehicle mass, kg\n",
    "    g = params.get('g', 9.8)                # gravitational constant, m/s^2\n",
    "    Cr = params.get('Cr', 0.01)             # coefficient of rolling friction\n",
    "    Cd = params.get('Cd', 0.32)             # drag coefficient\n",
    "    rho = params.get('rho', 1.3)            # density of air, kg/m^3\n",
    "    A = params.get('A', 2.4)                # car area, m^2\n",
    "    alpha = params.get(\n",
    "        'alpha', [40, 25, 16, 12, 10])      # gear ratio / wheel radius\n",
    "\n",
    "    # Define variables for vehicle state and inputs\n",
    "    v = x[0]                           # vehicle velocity\n",
    "    throttle = np.clip(u[0], 0, 1)     # vehicle throttle\n",
    "    gear = u[1]                        # vehicle gear\n",
    "    theta = u[2]                       # road slope\n",
    "\n",
    "    # Force generated by the engine\n",
    "\n",
    "    omega = alpha[int(gear)-1] * v      # engine angular speed\n",
    "    F = alpha[int(gear)-1] * motor_torque(omega, params) * throttle\n",
    "\n",
    "    # Disturbance forces\n",
    "    #\n",
    "    # The disturbance force Fd has three major components: Fg, the forces due\n",
    "    # to gravity; Fr, the forces due to rolling friction; and Fa, the\n",
    "    # aerodynamic drag.\n",
    "\n",
    "    # Letting the slope of the road be \\theta (theta), gravity gives the\n",
    "    # force Fg = m g sin \\theta.\n",
    "    \n",
    "    Fg = m * g * sin(theta)\n",
    "\n",
    "    # A simple model of rolling friction is Fr = m g Cr sgn(v), where Cr is\n",
    "    # the coefficient of rolling friction and sgn(v) is the sign of v (±1) or\n",
    "    # zero if v = 0.\n",
    "    \n",
    "    Fr  = m * g * Cr * sign(v)\n",
    "\n",
    "    # The aerodynamic drag is proportional to the square of the speed: Fa =\n",
    "    # 1/2 \\rho Cd A |v| v, where \\rho is the density of air, Cd is the\n",
    "    # shape-dependent aerodynamic drag coefficient, and A is the frontal area\n",
    "    # of the car.\n",
    "\n",
    "    Fa = 1/2 * rho * Cd * A * abs(v) * v\n",
    "    \n",
    "    # Final acceleration on the car\n",
    "    Fd = Fg + Fr + Fa\n",
    "    dv = (F - Fd) / m\n",
    "    \n",
    "    return dv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Engine model\n",
    "\n",
    "The force F is generated by the engine, whose torque is proportional to the rate of fuel injection, which is itself proportional to a control signal 0 <= u <= 1 that controls the throttle position. The torque also depends on engine speed omega."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def motor_torque(omega, params={}):\n",
    "    # Set up the system parameters\n",
    "    Tm = params.get('Tm', 190.)             # engine torque constant\n",
    "    omega_m = params.get('omega_m', 420.)   # peak engine angular speed\n",
    "    beta = params.get('beta', 0.4)          # peak engine rolloff\n",
    "\n",
    "    return np.clip(Tm * (1 - beta * (omega/omega_m - 1)**2), 0, None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Torque curves for a typical car engine. The graph on the left shows the torque generated by the engine as a function of the angular velocity of the engine, while the curve on the right shows torque as a function of car speed for different gears."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Figure 4.2a - single torque curve as function of omega\n",
    "omega_range = np.linspace(0, 700, 701)\n",
    "plt.subplot(2, 2, 1)\n",
    "plt.plot(omega_range, [motor_torque(w) for w in omega_range])\n",
    "plt.xlabel('Angular velocity $\\omega$ [rad/s]')\n",
    "plt.ylabel('Torque $T$ [Nm]')\n",
    "plt.grid(True, linestyle='dotted')\n",
    "\n",
    "# Figure 4.2b - torque curves in different gears, as function of velocity\n",
    "plt.subplot(2, 2, 2)\n",
    "v_range = np.linspace(0, 70, 71)\n",
    "alpha = [40, 25, 16, 12, 10]\n",
    "for gear in range(5):\n",
    "    omega_range = alpha[gear] * v_range\n",
    "    plt.plot(v_range, [motor_torque(w) for w in omega_range],\n",
    "             color='blue', linestyle='solid')\n",
    "\n",
    "# Set up the axes and style\n",
    "plt.axis([0, 70, 100, 200])\n",
    "plt.grid(True, linestyle='dotted')\n",
    "\n",
    "# Add labels\n",
    "plt.text(11.5, 120, '$n$=1')\n",
    "plt.text(24, 120, '$n$=2')\n",
    "plt.text(42.5, 120, '$n$=3')\n",
    "plt.text(58.5, 120, '$n$=4')\n",
    "plt.text(58.5, 185, '$n$=5')\n",
    "plt.xlabel('Velocity $v$ [m/s]')\n",
    "plt.ylabel('Torque $T$ [Nm]')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.suptitle('Torque curves for typical car engine');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Input/ouput model for the vehicle system\n",
    "\n",
    "We now create an input/output model for the vehicle system that takes the throttle input $u$, the gear and the angle of the road $\\theta$ as input.  The output of this model is the current vehicle velocity $v$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "vehicle = ct.NonlinearIOSystem(\n",
    "    vehicle_update, None, name='vehicle',\n",
    "    inputs = ('u', 'gear', 'theta'), outputs = ('v'), states=('v'))\n",
    "\n",
    "# Define a generator for creating a \"standard\" cruise control plot\n",
    "def cruise_plot(sys, t, y, t_hill=5, vref=20, antiwindup=False, linetype='b-',\n",
    "               subplots=[None, None]):\n",
    "    # Figure out the plot bounds and indices\n",
    "    v_min = vref-1.2; v_max = vref+0.5; v_ind = sys.find_output('v')\n",
    "    u_min = 0; u_max = 2 if antiwindup else 1; u_ind = sys.find_output('u')\n",
    "\n",
    "    # Make sure the upper and lower bounds on v are OK\n",
    "    while max(y[v_ind]) > v_max: v_max += 1\n",
    "    while min(y[v_ind]) < v_min: v_min -= 1\n",
    "        \n",
    "    # Create arrays for return values\n",
    "    subplot_axes = subplots.copy()\n",
    "\n",
    "    # Velocity profile\n",
    "    if subplot_axes[0] is None:\n",
    "        subplot_axes[0] = plt.subplot(2, 1, 1)\n",
    "    else:\n",
    "        plt.sca(subplots[0])\n",
    "    plt.plot(t, y[v_ind], linetype)\n",
    "    plt.plot(t, vref*np.ones(t.shape), 'k-')\n",
    "    plt.plot([t_hill, t_hill], [v_min, v_max], 'k--')\n",
    "    plt.axis([0, t[-1], v_min, v_max])\n",
    "    plt.xlabel('Time $t$ [s]')\n",
    "    plt.ylabel('Velocity $v$ [m/s]')\n",
    "\n",
    "    # Commanded input profile\n",
    "    if subplot_axes[1] is None:\n",
    "        subplot_axes[1] = plt.subplot(2, 1, 2)\n",
    "    else:\n",
    "        plt.sca(subplots[1])\n",
    "    plt.plot(t, y[u_ind], 'r--' if antiwindup else linetype)\n",
    "    plt.plot([t_hill, t_hill], [u_min, u_max], 'k--')\n",
    "    plt.axis([0, t[-1], u_min, u_max])\n",
    "    plt.xlabel('Time $t$ [s]')\n",
    "    plt.ylabel('Throttle $u$')\n",
    "\n",
    "    # Applied input profile\n",
    "    if antiwindup:\n",
    "        plt.plot(t, np.clip(y[u_ind], 0, 1), linetype)\n",
    "        plt.legend(['Commanded', 'Applied'], frameon=False)\n",
    "        \n",
    "    return subplot_axes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## State space controller\n",
    "\n",
    "Construct a state space controller with integral action, linearized around an equilibrium point.  The controller is constructed around the equilibrium point $(x_d, u_d)$ and includes both feedforward and feedback compensation.\n",
    "\n",
    "* Controller inputs - $(x, y, r)$: system states, system output, reference\n",
    "* Controller state - $z$: integrated error $(y - r)$\n",
    "* Controller output - $u$: state feedback control\n",
    "\n",
    "Note: to make the structure of the controller more clear, we implement this as a \"nonlinear\" input/output module, even though the actual input/output system is linear.  This also allows the use of parameters to set the operating point and gains for the controller.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Xeq =  [20.]\n",
      "Ueq =  [0.16874874 4.         0.        ]\n"
     ]
    }
   ],
   "source": [
    "def sf_update(t, z, u, params={}):\n",
    "    y, r = u[1], u[2]\n",
    "    return y - r\n",
    "\n",
    "def sf_output(t, z, u, params={}):\n",
    "    # Get the controller parameters that we need\n",
    "    K = params.get('K', 0)\n",
    "    ki = params.get('ki', 0)\n",
    "    kf = params.get('kf', 0)\n",
    "    xd = params.get('xd', 0)\n",
    "    yd = params.get('yd', 0)\n",
    "    ud = params.get('ud', 0)\n",
    "\n",
    "    # Get the system state and reference input\n",
    "    x, y, r = u[0], u[1], u[2]\n",
    "\n",
    "    return ud - K * (x - xd) - ki * z + kf * (r - yd)\n",
    "\n",
    "# Create the input/output system for the controller\n",
    "control_sf = ct.NonlinearIOSystem(\n",
    "    sf_update, sf_output, name='control',\n",
    "    inputs=('x', 'y', 'r'),\n",
    "    outputs=('u'),\n",
    "    states=('z'))\n",
    "\n",
    "# Create the closed loop system for the state space controller\n",
    "cruise_sf = ct.InterconnectedSystem(\n",
    "    (vehicle, control_sf), name='cruise',\n",
    "    connections=(\n",
    "        ('vehicle.u', 'control.u'),\n",
    "        ('control.x', 'vehicle.v'),\n",
    "        ('control.y', 'vehicle.v')),\n",
    "    inplist=('control.r', 'vehicle.gear', 'vehicle.theta'),\n",
    "    outlist=('control.u', 'vehicle.v'), outputs=['u', 'v'])\n",
    "\n",
    "# Define the time and input vectors\n",
    "T = np.linspace(0, 25, 501)\n",
    "vref = 20 * np.ones(T.shape)\n",
    "gear = 4 * np.ones(T.shape)\n",
    "theta0 = np.zeros(T.shape)\n",
    "\n",
    "# Find the equilibrium point for the system\n",
    "Xeq, Ueq = ct.find_eqpt(\n",
    "    vehicle, [vref[0]], [0, gear[0], theta0[0]], y0=[vref[0]], iu=[1, 2])\n",
    "print(\"Xeq = \", Xeq)\n",
    "print(\"Ueq = \", Ueq)\n",
    "\n",
    "# Compute the linearized system at the eq pt\n",
    "cruise_linearized = ct.linearize(vehicle, Xeq, [Ueq[0], gear[0], 0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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51mUxLzUblmiTp0UPfPM2YRfYufOUK0arFgBP/2UM023blCpEixfDivDFg8O5dGjh/UlLFkCa9ZklSUkmBzMC2pdNleCpCQ4M/BDmzcPNmzImn/VqnDGGbY/ezYEA1sP5V+zpjVHAXzzja1cGH5tdepAly62/cUXsGuXyWfMOIGMjCTq1FnItm1w2mnwzDPQoUOexec4pZoePXowYcIEjjjiiJjSTZ8+nccee4wpU6YUiR7p6ekk5jIp3dChQ6lZsyZ33nlnoc5Rs2bNHDMWFxcFGUcS9xl6izNAR7VXaUUPZyqcrk2aqL79tmp6ep6TfzpOXHn00Ud15MiRqqp6++23a48ePVRV9eOPP9arr75aVVV37Nihp512Wo60//73v/WWW25RVZstd/DgwXrqqafqMccco2+++aaqqnbu3FkPO+wwbdeunT7xxBOalpamd955p6akpGibNm30X//6l6qqpqen680336wnnnii9u3bV3v37n0oj6ZNm+rf/vY37dq1q44fP15Hjx6tKSkp2rZtW73kkkt09+7dqpp1RuFwJk+erKeccoq2b99ee/bsqb/88ouq2szHAwcO1JNOOknbtGmjEydO1L/85S+akJCg7dq106uuukpVVWvUqKGqqhkZGXrnnXdq69at9aSTTtLXX39dVVWnTZumZ555pl566aV6wgkn6FVXXRX1bMEU8+y/ZY42beC9oEcm5JFUo4bVHA4csOadECF5tWq2nZZmHdHhMhGrVYjYLLmqOdMnJtp2uCxcnn07O/l5ThUk7Y8/Pk9iIrRqlXfejpOd22+HuXOLNs/27fNeLO2MM87g8ccf57bbbmP27Nns37+fgwcP8uWXX3L66acD8PHHH9OzZ/5D29avX8+XX37JDz/8wIUXXshll13G8OHDs9RIRo8eTe3atZk1axb79++na9eunHvuuaSmprJixQoWLFjAxo0badWqFdddd92hvKtWrcqXX34JwJYtW7jhhhsAuO+++3jxxRcZPHhwrnp169aNGTNmICKMGTOGESNG8PjjjzNs2DBq167NggULANi2bRuXXnopzzzzDHMj/BFvvfUWc+fOZd68eWzevJlOnTpxRtCsMWfOHBYtWkSDBg3o2rUrX331Fd26dcu3zApCuTYklStDo0b/3969x0hVnnEc//4AiwYqQYlAxRZajbjd7m7BrJGy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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Construct the gain matrices for the system\n",
    "A, B, C = cruise_linearized.A, cruise_linearized.B[0, 0], cruise_linearized.C\n",
    "K = 0.5\n",
    "kf = -1 / (C * np.linalg.inv(A - B * K) * B)\n",
    "\n",
    "# Compute the steady state velocity and throttle setting\n",
    "xd = Xeq[0]\n",
    "ud = Ueq[0]\n",
    "yd = vref[-1]\n",
    "\n",
    "# Response of the system with no integral feedback term\n",
    "plt.figure()\n",
    "theta_hill = [\n",
    "    0 if t <= 5 else\n",
    "    4./180. * pi * (t-5) if t <= 6 else\n",
    "    4./180. * pi for t in T]\n",
    "t, y_sfb = ct.input_output_response(\n",
    "    cruise_sf, T, [vref, gear, theta_hill], [Xeq[0], 0],\n",
    "    params={'K':K, 'ki':0.0, 'kf':kf, 'xd':xd, 'ud':ud, 'yd':yd})\n",
    "subplots = cruise_plot(cruise_sf, t, y_sfb, t_hill=5, linetype='b--')\n",
    "\n",
    "# Response of the system with state feedback + integral action\n",
    "t, y_sfb_int = ct.input_output_response(\n",
    "    cruise_sf, T, [vref, gear, theta_hill], [Xeq[0], 0],\n",
    "    params={'K':K, 'ki':0.1, 'kf':kf, 'xd':xd, 'ud':ud, 'yd':yd})\n",
    "cruise_plot(cruise_sf, t, y_sfb_int, t_hill=5, linetype='b-', subplots=subplots)\n",
    "\n",
    "# Add title and legend\n",
    "plt.suptitle('Cruise control with state feedback, integral action')\n",
    "import matplotlib.lines as mlines\n",
    "p_line = mlines.Line2D([], [], color='blue', linestyle='--', label='State feedback')\n",
    "pi_line = mlines.Line2D([], [], color='blue', linestyle='-', label='w/ integral action')\n",
    "plt.legend(handles=[p_line, pi_line], frameon=False, loc='lower right');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pole/zero cancellation\n",
    "\n",
    "The transfer function for the linearized dynamics of the cruise control system is given by $P(s) = b/(s+a)$.  A simple (but not necessarily good) way to design a PI controller is to choose the parameters of the PI controller as $k_\\text{i}=ak_\\text{p}$.  The controller transfer function is then $C(s)=k_\\text{p}+k_\\text{i}/s=k_\\text{i}(s+a)/s$. It has a zero at $s = -k_\\text{i}/k_\\text{p}=-a$ that cancels the process pole at $s = -a$. We have $P(s)C(s)=k_\\text{i}/s$ giving the transfer function from reference to vehicle velocity as $G_{yr}(s)=b k_\\text{p}/(s + b k_\\text{p})$, and control design is then simply a matter of choosing the gain $k_\\text{p}$. The closed loop system dynamics are of first order with the time constant $1/(b k_\\text{p})$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "system: a =  0.010124405669387215 , b =  1.3203061238159202\n",
      "pzcancel: kp = 0.5 , ki = 0.005062202834693608 , 1/(kp b) =  1.5148002148317266\n",
      "sfb_int: K =  0.5 , ki = 0.1\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Get the transfer function from throttle input + hill to vehicle speed\n",
    "P = ct.ss2tf(cruise_linearized[0, 0])\n",
    "\n",
    "# Construction a controller that cancels the pole\n",
    "kp = 0.5\n",
    "a = -P.pole()[0]\n",
    "b = np.real(P(0)) * a\n",
    "ki = a * kp\n",
    "C = ct.tf2ss(ct.TransferFunction([kp, ki], [1, 0]))\n",
    "control_pz = ct.LinearIOSystem(C, name='control', inputs='u', outputs='y')\n",
    "print(\"system: a = \", a, \", b = \", b)\n",
    "print(\"pzcancel: kp =\", kp, \", ki =\", ki, \", 1/(kp b) = \", 1/(kp * b))\n",
    "print(\"sfb_int: K = \", K, \", ki = 0.1\")\n",
    "\n",
    "# Construct the closed loop system and plot the response\n",
    "# Create the closed loop system for the state space controller\n",
    "cruise_pz = ct.InterconnectedSystem(\n",
    "    (vehicle, control_pz), name='cruise_pz',\n",
    "    connections = (\n",
    "        ('control.u', '-vehicle.v'),\n",
    "        ('vehicle.u', 'control.y')),\n",
    "    inplist = ('control.u', 'vehicle.gear', 'vehicle.theta'),\n",
    "    inputs = ('vref', 'gear', 'theta'),\n",
    "    outlist = ('vehicle.v', 'vehicle.u'),\n",
    "    outputs = ('v', 'u'))\n",
    "\n",
    "# Find the equilibrium point\n",
    "X0, U0 = ct.find_eqpt(\n",
    "    cruise_pz, [vref[0], 0], [vref[0], gear[0], theta0[0]], \n",
    "    iu=[1, 2], y0=[vref[0], 0], iy=[0])\n",
    "\n",
    "# Response of the system with PI controller canceling process pole\n",
    "t, y_pzcancel = ct.input_output_response(\n",
    "    cruise_pz, T, [vref, gear, theta_hill], X0)\n",
    "subplots = cruise_plot(cruise_pz, t, y_pzcancel, t_hill=5, linetype='b-')\n",
    "cruise_plot(cruise_sf, t, y_sfb_int, t_hill=5, linetype='b--', subplots=subplots);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## PI Controller\n",
    "\n",
    "In this example, the speed of the vehicle is measured and compared to the desired speed.  The controller is a PI controller represented as a transfer function.  In the textbook, the simulations are done for LTI systems, but here we simulate the full nonlinear system."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Parameter design through pole placement\n",
    "\n",
    "To illustrate the design of a PI controller, we choose the gains $k_\\text{p}$ and $k_\\text{i}$ so that the characteristic polynomial has the form\n",
    "\n",
    "$$\n",
    "s^2 + 2 \\zeta \\omega_0 s + \\omega_0^2\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Values of the first order transfer function P(s) = b/(s + a) are set above\n",
    "\n",
    "# Define the input that we want to track\n",
    "T = np.linspace(0, 40, 101)\n",
    "vref = 20 * np.ones(T.shape)\n",
    "gear = 4 * np.ones(T.shape)\n",
    "theta_hill = np.array([\n",
    "    0 if t <= 5 else\n",
    "    4./180. * pi * (t-5) if t <= 6 else\n",
    "    4./180. * pi for t in T])\n",
    "\n",
    "# Fix \\omega_0 and vary \\zeta\n",
    "w0 = 0.5\n",
    "subplots = [None, None]\n",
    "for zeta in [0.5, 1, 2]:\n",
    "    # Create the controller transfer function (as an I/O system)\n",
    "    kp = (2*zeta*w0 - a)/b\n",
    "    ki = w0**2 / b\n",
    "    control_tf = ct.tf2io(\n",
    "        ct.TransferFunction([kp, ki], [1, 0.01*ki/kp]),\n",
    "        name='control', inputs='u', outputs='y')\n",
    "    \n",
    "    # Construct the closed loop system by interconnecting process and controller\n",
    "    cruise_tf = ct.InterconnectedSystem(\n",
    "    (vehicle, control_tf), name='cruise',\n",
    "    connections = [('control.u', '-vehicle.v'), ('vehicle.u', 'control.y')],\n",
    "    inplist = ('control.u', 'vehicle.gear', 'vehicle.theta'), \n",
    "        inputs = ('vref', 'gear', 'theta'),\n",
    "    outlist = ('vehicle.v', 'vehicle.u'), outputs = ('v', 'u'))\n",
    "\n",
    "    # Plot the velocity response\n",
    "    X0, U0 = ct.find_eqpt(\n",
    "        cruise_tf, [vref[0], 0], [vref[0], gear[0], theta_hill[0]], \n",
    "        iu=[1, 2], y0=[vref[0], 0], iy=[0])\n",
    "\n",
    "    t, y = ct.input_output_response(cruise_tf, T, [vref, gear, theta_hill], X0)\n",
    "    subplots = cruise_plot(cruise_tf, t, y, t_hill=5, subplots=subplots)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Fix \\zeta and vary \\omega_0\n",
    "zeta = 1\n",
    "subplots = [None, None]\n",
    "for w0 in [0.2, 0.5, 1]:\n",
    "    # Create the controller transfer function (as an I/O system)\n",
    "    kp = (2*zeta*w0 - a)/b\n",
    "    ki = w0**2 / b\n",
    "    control_tf = ct.tf2io(\n",
    "        ct.TransferFunction([kp, ki], [1, 0.01*ki/kp]),\n",
    "        name='control', inputs='u', outputs='y')\n",
    "    \n",
    "    # Construct the closed loop system by interconnecting process and controller\n",
    "    cruise_tf = ct.InterconnectedSystem(\n",
    "    (vehicle, control_tf), name='cruise',\n",
    "    connections = [('control.u', '-vehicle.v'), ('vehicle.u', 'control.y')],\n",
    "    inplist = ('control.u', 'vehicle.gear', 'vehicle.theta'), \n",
    "        inputs = ('vref', 'gear', 'theta'),\n",
    "    outlist = ('vehicle.v', 'vehicle.u'), outputs = ('v', 'u'))\n",
    "\n",
    "    # Plot the velocity response\n",
    "    X0, U0 = ct.find_eqpt(\n",
    "        cruise_tf, [vref[0], 0], [vref[0], gear[0], theta_hill[0]], \n",
    "        iu=[1, 2], y0=[vref[0], 0], iy=[0])\n",
    "\n",
    "    t, y = ct.input_output_response(cruise_tf, T, [vref, gear, theta_hill], X0)\n",
    "    subplots = cruise_plot(cruise_tf, t, y, t_hill=5, subplots=subplots)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Robustness to change in mass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Nominal controller design for remaining analyses\n",
    "# Construct a PI controller with rolloff, as a transfer function\n",
    "Kp = 0.5                        # proportional gain\n",
    "Ki = 0.1                        # integral gain\n",
    "control_tf = ct.tf2io(\n",
    "    ct.TransferFunction([Kp, Ki], [1, 0.01*Ki/Kp]),\n",
    "    name='control', inputs='u', outputs='y')\n",
    "\n",
    "cruise_tf = ct.InterconnectedSystem(\n",
    "    (vehicle, control_tf), name='cruise',\n",
    "    connections = [('control.u', '-vehicle.v'), ('vehicle.u', 'control.y')],\n",
    "    inplist = ('control.u', 'vehicle.gear', 'vehicle.theta'), inputs = ('vref', 'gear', 'theta'),\n",
    "    outlist = ('vehicle.v', 'vehicle.u'), outputs = ('v', 'u'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Define the time and input vectors\n",
    "T = np.linspace(0, 25, 101)\n",
    "vref = 20 * np.ones(T.shape)\n",
    "gear = 4 * np.ones(T.shape)\n",
    "theta0 = np.zeros(T.shape)\n",
    "\n",
    "# Now simulate the effect of a hill at t = 5 seconds\n",
    "plt.figure()\n",
    "plt.suptitle('Response to change in road slope')\n",
    "theta_hill = np.array([\n",
    "    0 if t <= 5 else\n",
    "    4./180. * pi * (t-5) if t <= 6 else\n",
    "    4./180. * pi for t in T])\n",
    "\n",
    "subplots = [None, None]\n",
    "linecolor = ['red', 'blue', 'green']\n",
    "handles = []\n",
    "for i, m in enumerate([1200, 1600, 2000]):\n",
    "    # Compute the equilibrium state for the system\n",
    "    X0, U0 = ct.find_eqpt(\n",
    "        cruise_tf, [vref[0], 0], [vref[0], gear[0], theta0[0]], \n",
    "        iu=[1, 2], y0=[vref[0], 0], iy=[0], params={'m':m})\n",
    "\n",
    "    t, y = ct.input_output_response(\n",
    "        cruise_tf, T, [vref, gear, theta_hill], X0, params={'m':m})\n",
    "\n",
    "    subplots = cruise_plot(cruise_tf, t, y, t_hill=5, subplots=subplots,\n",
    "                           linetype=linecolor[i][0] + '-')\n",
    "    handles.append(mlines.Line2D([], [], color=linecolor[i], linestyle='-', \n",
    "                                 label=\"m = %d\" % m))\n",
    "\n",
    "# Add labels to the plots\n",
    "plt.sca(subplots[0])\n",
    "plt.ylabel('Speed [m/s]')\n",
    "plt.legend(handles=handles, frameon=False, loc='lower right');\n",
    "\n",
    "plt.sca(subplots[1])\n",
    "plt.ylabel('Throttle')\n",
    "plt.xlabel('Time [s]');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## PI controller with  antiwindup protection\n",
    "\n",
    "We now create a more complicated feedback controller that includes anti-windup protection."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def pi_update(t, x, u, params={}):\n",
    "    # Get the controller parameters that we need\n",
    "    ki = params.get('ki', 0.1)\n",
    "    kaw = params.get('kaw', 2)  # anti-windup gain\n",
    "\n",
    "    # Assign variables for inputs and states (for readability)\n",
    "    v = u[0]                    # current velocity\n",
    "    vref = u[1]                 # reference velocity\n",
    "    z = x[0]                    # integrated error\n",
    "\n",
    "    # Compute the nominal controller output (needed for anti-windup)\n",
    "    u_a = pi_output(t, x, u, params)\n",
    "\n",
    "    # Compute anti-windup compensation (scale by ki to account for structure)\n",
    "    u_aw = kaw/ki * (np.clip(u_a, 0, 1) - u_a) if ki != 0 else 0\n",
    "\n",
    "    # State is the integrated error, minus anti-windup compensation\n",
    "    return (vref - v) + u_aw\n",
    "\n",
    "def pi_output(t, x, u, params={}):\n",
    "    # Get the controller parameters that we need\n",
    "    kp = params.get('kp', 0.5)\n",
    "    ki = params.get('ki', 0.1)\n",
    "\n",
    "    # Assign variables for inputs and states (for readability)\n",
    "    v = u[0]                    # current velocity\n",
    "    vref = u[1]                 # reference velocity\n",
    "    z = x[0]                    # integrated error\n",
    "\n",
    "    # PI controller\n",
    "    return kp * (vref - v) + ki * z\n",
    "\n",
    "control_pi = ct.NonlinearIOSystem(\n",
    "    pi_update, pi_output, name='control',\n",
    "    inputs = ['v', 'vref'], outputs = ['u'], states = ['z'],\n",
    "    params = {'kp':0.5, 'ki':0.1})\n",
    "\n",
    "# Create the closed loop system\n",
    "cruise_pi = ct.InterconnectedSystem(\n",
    "    (vehicle, control_pi), name='cruise',\n",
    "    connections=(\n",
    "        ('vehicle.u', 'control.u'),\n",
    "        ('control.v', 'vehicle.v')),\n",
    "    inplist=('control.vref', 'vehicle.gear', 'vehicle.theta'),\n",
    "    outlist=('control.u', 'vehicle.v'), outputs=['u', 'v'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Response to a small hill\n",
    "\n",
    "Figure 4.3b shows the response of the closed loop system.  The figure shows that even if the hill is so steep that the throttle changes from 0.17 to almost full throttle, the largest speed error is less than 1 m/s, and the desired velocity is recovered after 20 s."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Compute the equilibrium throttle setting for the desired speed\n",
    "X0, U0, Y0 = ct.find_eqpt(\n",
    "    cruise_pi, [vref[0], 0], [vref[0], gear[0], theta0[0]],\n",
    "    y0=[0, vref[0]], iu=[1, 2], iy=[1], return_y=True)\n",
    "\n",
    "# Now simulate the effect of a hill at t = 5 seconds\n",
    "plt.figure()\n",
    "plt.suptitle('Car with cruise control encountering sloping road')\n",
    "theta_hill = [\n",
    "    0 if t <= 5 else\n",
    "    4./180. * pi * (t-5) if t <= 6 else\n",
    "    4./180. * pi for t in T]\n",
    "t, y = ct.input_output_response(\n",
    "    cruise_pi, T, [vref, gear, theta_hill], X0)\n",
    "cruise_plot(cruise_pi, t, y);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Effect of Windup\n",
    "\n",
    "The windup effect occurs when a car encounters a hill that is so steep ($6^\\circ$) that the throttle saturates when the cruise controller attempts to maintain speed."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure()\n",
    "plt.suptitle('Cruise control with integrator windup')\n",
    "T = np.linspace(0, 50, 101)\n",
    "vref = 20 * np.ones(T.shape)\n",
    "theta_hill = [\n",
    "    0 if t <= 5 else\n",
    "    6./180. * pi * (t-5) if t <= 6 else\n",
    "    6./180. * pi for t in T]\n",
    "t, y = ct.input_output_response(\n",
    "    cruise_pi, T, [vref, gear, theta_hill], X0,\n",
    "    params={'kaw':0})\n",
    "cruise_plot(cruise_pi, t, y, antiwindup=True);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### PI controller with anti-windup compensation\n",
    "\n",
    "Anti-windup can be applied to the system to improve the response. Because of the feedback from the actuator model, the output of the integrator is quickly reset to a value such that the controller output is at the saturation limit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAEnCAYAAACDhcU8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzs3Xd4lFX2wPHvSQiELhhAlKpSFekIihJFWUSwIsquLrjrqtjXtqzLirpYV110LSuKYkGEZVHRHxYsiIB0QhNQRJr0Ii2UlPP7475JhjBJZjItmTmf55lnZt565k45c9/7vveKqmKMMcaUVlKsAzDGGFO+WSIxxhgTEkskxhhjQmKJxBhjTEgskRhjjAmJJRJjjDEhsUQSIhFZLiLpsY4jGkTkIRF5J8Rt/E5EPi9mfrqIbAxie5+IyKBQYjIFwlGeItJIRPaLSHIp118rIheEEkN5F2oZRlvCJRIR+a2IzPfepM3eF6d7abenqqep6rQwhhgR4UgC4aCqY1W1V95zEVEROTWE7V2kqm8GsqyITBORG0q7r1CVlfcgj794ginPoqjqelWtpqo5oUVYtoXz/SycPMtbGSZUIhGRu4GRwGNAPaAR8BJwaRHLV4hedLElTkJ9HsIpGp+VRPo8xpp9H4KkqglxA2oC+4GrilnmIWAi8A6wF7gBGAOM8FkmHdjo83wtcIH3uAsw31t3K/Csz3JdgVnAr8BiIL2YOBoCk4DtwE7gBW96EjAMWAdsA94CanrzmgAKDALWAzuAv3nzegNHgCyvDBZ706cBjwIzgYPAqcCJwGRgF7Aa+FOh8nmniJi/Aa70Hnf3YunjPb8AyPAeDwZmeI+ne8sd8OK6Oq98gXu817gZuL6YspoG3OC7beBpYDfwM3CRN+9RIAc45O0rr0xbAlO917sKGOCz7eOBj7z3cx4wIi92b74CtwI/Aj97054DNnjrLADOKeE9KKm8j/o8+nn9FwOLvPkbgId85pX2M3HMfrx5DwP/9h6neO/bU97zyl7Z1vLZbwWfbf4D9znbB3wOpPls9zrcZ3on8DeO/k6NoeTv31+B7733/A0gtYj4B3sx/BvYA6wEehb6LAX0fSim/GoCo3Gf219wn5lkn338CVjhlcP3QAfgbSDX2+d+4H4/ZVjS52QC7vdgH7Ac6BTV39do7iyWN++Nz857Y4pY5iHvg3EZ7ke7coAf5LwP/XfAdd7jakBX7/FJ3pekj7fdC73ndfzEkIxLNP8CqgKpQHdv3h+8D9HJ3vYnAW978/I+eK96cbcFDgOtfF7bO4X2NQ33A3MaUAH34/ANrpaWCrTDJbOeRW3DZ1uPUPAj8wDwE/Ckz7znfL7MhX+MTy1UvtneOilemWUCtYrY7zSOTiRZuC9rMjAE2ARI4WW951VxP77Xe6+/A+7H9jRv/nverQrQ2lu2cOxTgdpAZW/atbgEVAGXDLfg/bAV8R6UVN5HfR79vP50oI03/wzcH5jLQvxMFJVIzgeWeo/P8t7jOT7zFhfar28i+Qlo7sUxDXjCm9ca9+N5LlAJeNZ7/4NJJMtwf75q45LAiCLiH+xt+8+4z9bVuIRSO1zfB+AD4BXcZ6suMBe4yZt3FS65dAYEl6gaF/4dKaIMS4rjEO67kgw8DsyO5u9rIlXdjgd2qGp2Cct9p6ofqGquqh4Mch9ZwKkikqaq+1V1tjf9WmCKqk7xtjsVV3Pp42cbXXD/Pu5T1QOqekhVZ3jzfoer5axR1f24f2LXFDrk8bCqHlTVxbiE1LaEmMeo6nKvXE7A1Sb+4u03A3gN94+xJN8APbzH5+I+zHnPe3jzA5UFPKKqWao6BfdD0yLAddep6qvqji2/CdTHHcb0py+wVlXfUNVsVV0I/A/o7zVyXgkMV9VMVf3e215hj6vqrrzPiqq+o6o7ve09g/tx9Bu7iDSk5PIu9vOoqtNUdak3fwkwjoJyzxPsZ6Io3wHNROR43Hs8GjhJRKpR8nv8hqr+4L2GCbgfQ4D+wMeqOl1VDwN/x/07D8YLqrpBVXfhahQDi1l2GzDS+2yNx9VCL/aZX+rvg4jUAy4C7vK+u9twfwiv8Ra5AVeDm6fOalVdV9KLC/BzMsP7fcnB1XBK+x6XSiIlkp1AWgDHmTeEsI8/4v51rRSReSLS15veGLhKRH7Nu+E+GPX9bKMh7sfQX8I7EXcIIM863D8n3x/KLT6PM3E1l+L4vt4TgV2quq/QPk4qYRvgfmSae1+mdrhqdkMRScMlx+kBbCPPzkKvP5DXkSf/9atqpvewqHUbA2cWel9+h/sBqYMrW9/y8ffZOGqaiNwjIitEZI+3vZpAWhH7D6S8i/08isiZIvK1iGwXkT3AzX72F+xnIm/by72TUvaLyDleEpiPSxrn4hLHLOBsSk4kRcVwIj6vUVUP4L6rwfAto3XeNovyi3p/44tYPpTvQ2NcLWazz+fpFVzNBNx3+6diYitKIHEULt/UaLapJVLj3Xe46t9luOPORdFCzw/gDm3kOaHIFVV/BAZ6jXRXABO9f28bcIeg/hRAnBuARiJSwU8y2YT7sOZphKuqbwUalLDdwq/L3/RNQG0Rqe7zoW2Eq44Xv3HVTBFZANwJLFPVIyIyC7gb+ElVd5S0jSgoXAYbgG9U9cLCC3o1kmxcuf7gTW5Y3DZF5BzgL0BPYLmq5orIbtxhDH/7D6S8i3rf8rwLvIBrCzokIiMpOnEVGbvfmaqn+Zn8De4wVntcu9E3wG8I/s9Cns1Aq7wnIlIFd/QgTyDfP9/3pRGuXItykoiITzJphGt7yBPM98Hf5+kwrv3H3x/BDcApRcRV3HtR6u9ltCRMjURV9wAPAi+KyGUiUkVEUkTkIhF5qphVM4A+IlJbRE4A7ipqQRG5VkTqqGourlEdXAPvO0A/EfmNiCSLSKp3vYS/H/+5uC/XEyJS1Vv2bG/eOODPItLUO5zwGDA+gMN14JJNk+LORFHVDbh/mI97+z0DV8saG8D2wf2o3EbBP9NphZ4XFdfJAW4/VIX39TGuFnWd91lIEZHOItLKO0QwCXjI+6y0BH5fwvar45LPdqCCiDwI1Ci0//z3IAzlnbfPXV4S6QL8Noh1S/xM+PENrhy+V9UjeG0quJMNtgexnTwTgb4i0l1EKuLaxnzjCeT7d6uINBCR2rj2ufHF7K8ucIf3Xl+FS2JT/C0YwPtT+P3cjDuR4BkRqSEiSSJyiojkHWp8DbhXRDp6Z4WdKiKNfbbl93sQps9JRCVMIgFQ1Wdx/5CH4b7sG3A/dB8Us9rbuOPKa3EfkuI+pL2B5SKyH3f2zjXeMc0NuFOMH/DZ7334KX/vB6wfriFuPe4Mpqu92a978UzHnZF0CLi9hJed57/e/U4RWVjMcgNxDX2bgPdxbQRTA9zHN7gftulFPPfnIeBN71DAgAD3U1rP4do/dovI896/u164Y9ibcIcHnsS1a4D7bNT0pr+NS+SHi9n+Z8AnuBrMOtz743uoxN97EEp5A9wCPCIi+3B/lCYEsW6gnwlfs3AN5nnv6fe411ma2giquhx35tu7uD9Qu3Gf+TyBfP/e9eat8W4jitnlHKAZ7qSKR4H+qlrcobTi3h9/5fd7oCIFZ5FNxDuErar/9fb5Lu7sqg9wJwiAa1Mc5n0P7g0yjpjLO5vFGFMCEXkSOEFVB8U6FuOIyFrcWWZfBLDsYG/ZUl+AbPxLqBqJMcEQkZYicoZ3GKIL7nDC+7GOy5iyJpEa240JVnXc4awTcaeNPgN8GNOIjCmD7NCWMcaYkNihLWOMMSGxRGKMMSYklkiMMcaExBKJMcaYkFgiMcYYExJLJMYYY0JiicQYY0xILJEYY4wJiSUSY4wxIbFEYowxJiSWSIwxxoQkaolERBp6Q4Ku8IbwvNObXltEporIj959rSLWzxGRDO822d8yxhhjoi9qnTaKSH2gvqouFJHqwALcsLeDcSO8PSEiQ4FaqvoXP+vvV9VAx+02xhgTJVGrkajqZlVd6D3eB6zADV5/KfCmt9ibuORijDGmnIhJG4mINAHa44a9rOeNdZw35nHdIlZLFZH5IjJbRCzZGGNMGRH1ga1EpBrwP+AuVd0rIoGu2khVN4nIycBXIrJUVX/ys/0bgRsBqlat2rFly5bhCj1oq1atAqBFixYxi8EYY4KxYMGCHapaJ5h1oppIRCQFl0TGquokb/JWEamvqpu9dpRt/tZV1U3e/RoRmYar0RyTSFR1FDAKoFOnTjp//vzwv5AApaenAzBt2rSYxWCMMcEQkXXBrhO1RCKu6jEaWKGqz/rMmgwMAp7w7o8ZytQ7kytTVQ+LSBpwNvBU5KMOTd++fWMdgjHGRFw0z9rqDnwLLAVyvckP4NpJJgCNgPXAVaq6S0Q6ATer6g0ichbwirdeEjBSVUeXtM9Y10iMMaa8EZEFqtopmHWiViNR1RlAUQ0iPf0sPx+4wXs8C2gTueiMMcaUll3ZHkHp6en57STGGBOvLJEYY4wJiSUSY4wxIbFEYowxJiSWSIwxxoQk6le2J5IBAwbEOgRjjIm4EhOJiNQOYDu5qvprGOKJK7fcckusQzDGmIgLpEayybsV1ylWMu6CQuMjMzMTgCpVqsQ4EmOMiZxAEskKVW1f3AIisihM8cSVPn36ANbXljEmvgXS2N4tTMsYY4yJQyUmElU9BCAiV3kjGyIifxeRSSLSwXcZY4wxiSeY03//rqr7vM4Xe+FGM3w5MmEZY4wpL4JJJDne/cXAy6r6IVAx/CEZY4wpT4K5juQXEXkFuAB4UkQqYRc0Fmvw4MGxDsEYYyIumEQyAOgNPK2qv3qjGd4XmbDigyUSY0wiCOSCxG7AbFXNBPKGx0VVNwObIxhbubdjxw4A0tLSYhyJMcZETiA1kkHAiyLyA/Ap8KmqbolsWPGhf//+gF1HYoyJbyUmElW9GUBEWgIXAWNEpCbwNS6xzFTVnGI2YYwxJo4F3FiuqitV9V+q2hs4H5gBXIUbc90YY0yCCrixXUQ6AX8DGnvrCaCqekaEYjPGGFMOBHP67ljgDeBKoB/Q17sPiIg0FJGvRWSFiCwXkTu96bVFZKqI/Ojd1ypi/UHeMj+KyKAg4jbGGBNBwZz+u11VJ4ewr2zgHlVd6HW1skBEpgKDgS9V9QkRGQoMBf7iu6LXlf1woBOg3rqTVXV3CPFE3JAhQ2IdgjHGRFwwiWS4iLwGfAkczpuoqpOKXqWA7+nCXlcrK4CTgEuBdG+xN4FpFEokwG+Aqaq6C8BLQL2BccXt8/BhWLMmkOjCq3p1qFULrr766ujv3JgwUoWcHMjOPvaWk1Nwy80tuKkGd8vbj79pvvfFESm493dLSip6WlH3xd0K79ff82CXK/w6fZ8XLiffx8GWre88f/sqjWASyfVASyAFyM3bPz7XlgRKRJoA7XEN9fW8JIOqbhaRun5WOQnY4PN8ozetWMuWreKUU9KDDS9skpIOUacOtGyZGrMYTHzLzoasLHfL+3Ev/COf90Nf+Ae/8I9/4Xt/PzjG+BNMImmrqm1C3aGIVAP+B9ylqnulcKouYjU/0/x+xEXkRuBGgAoVKnPqqaWNtHTy/sFlZcEvv6xk61Y48cR21KgR3ThM+ZeTAwcPutuhQ+52+HDBLSur5G2IQHKy+5edd593q1Ch4HHeP/HC/8ZL+neetw/fx7779hdPcc+LmhaMQP7Zl+axv+eliae0iiqX0pRpcWW8YkVwcUFwiWS2iLRW1e+D340jIim4JDLW55DYVhGp79VG6gPb/Ky6kYLDXwANcIfAjqGqo4BRAJ06ddL58/0uFhXnnJPO7NlwwgnTmDIlZmGYMkwVtm6F5csLbqtWuduWQpf9HnccNGwIDRrASSdBvXqQluZutWtDzZruVqOGO7xarRqkpMTmdZnyK8A/90cJJpF0BwaJyM+4NpKgTv8VF91o3IiLz/rMmoy7ev4J7/5DP6t/Bjzmc0ZXL+CvQcQeE8nJ7ov/yScwdy506RLriEwsqcLq1TB/PixcCIsXQ0YGbN9esEzt2tCqFVx0EbRoAaeeCqecAk2buiRhTFkUTCLpHeK+zgauA5aKSIY37QFcApkgIn8E1uMucsy7buVmVb1BVXeJyD+Aed56j+Q1vJd1J50Ee/fCww/D//1frKMx0bR/P8yZAzNmwMyZMG8e/Pqrm1exIpx+OvTrB2ec4R6fdpqrZYR6aMeYaAs4kajqulB2pKoz8N/WAdDTz/LzgRt8nr8OvB5KDLGQnAz33AMPPGC1kniXleUSx9Sp7jZ3rmvnEIE2bWDAAOjUCTp3dknDDjuZeCFaQkuQiCxU1Q6hLhMLro1kfsz2/9FHHwGQnt6PJk2ga1erlcSb/fvh00/h/ffde7tnj2ug7twZevaEc89177sdljLlhYgsUNVOwawTSI2klYgsKW6/gH1N/OjXr+DC/7vvhmHD3DHyaJ9JZsIrKws++wzefhsmT3ZnUx1/PFxxBfTtC+ed564jMiZRBJJIWgawjPX+68eqVasAaNGiBf36uUQyd64lkvJq1SoYNQreegt27HDJ4w9/cIeszj7bnU5rTCIKpBv5kNpGEtlNN90EuPFIWreG1FRYsAB++9sYB2YClp0NH3wAL78MX33lksWll8KgQfCb37hGc2MSnf2HipIKFaBtW5dITNm3fz+8/jqMHAk//wyNG8Ojj7oayAknxDo6Y8oWSyRR1LGjO66em+saZE3Z8+uv8Nxz7rZ7N5x1Fjz9tKuFJCfHOjpjyqaAf85EZJaInBfJYOJdp06wbx/8+GOsIzGF/forDB8OTZrAQw/BOefArFnu+o8rrrAkYkxxgvlffCNwm4h8KSLdIhVQPOvY0d3b4a2y49AhV+M4+WR45BF3yu6iRfDhh9DNPuXGBCSYCxKXAVeKSAfgEa8/lmGqmlH8molr2LBhRz23BveyIzfXHWb8+99hwwbXJcljj0G7drGOzJjypzRtJKuBf+C6lZ9fym0khAsuuOCo59bgXjZ89x3ccYfr86pzZ3jzTXfthzGmdIJpI/lKRDYAC3B9ZO3GjW5oipCRkUFGxtEVto4dXYd9ublFrGQiZtMmuPZa14C+aRO8847r0sSSiDGhCaY2cS+u596DkQom3tx1112Au44kT8eO8NJLrsG9RYsYBZZgsrPhxRfdYawjR+Bvf4OhQ10368aY0AXTRrIwkoEkik5eDzYLFlgiiYY5c+Dmm1137b/5DbzwgvUsYEy42dUMUebb4G4iZ88euPVWd+bV9u3w3/+6cWEsiRgTftZQHmXW4B5ZqjBpEtx+uxth8PbbYcQIN2KgMSYygmlsv81nhEITAmtwj4z1690V6P37uwGi5sxxV6hbEjEmsoKpkZwAzBORhbgBpj7TkgYzSXCPPfaY3+nW4B5e2dmu7WPYMFcjefppuPNO643XmGgJuEaiqsOAZrhx1wcDP4rIYyJySoRiK/fOOusszjrrrGOm2xXu4bNwIZx5Jvz5z9CjByxf7kaktCRiTPQE1dju1UC2eLdsoBYwUUSeikBs5d6sWbOYNWvWMdNbt4ZKlSyRhGL/fjdYWOfO8Msv8N578PHHrq8sY0x0Bfy/TUTuAAYBO4DXgPtUNUtEkoAfgfsjE2L59cADDwBHX0cCbqzuNm3cKakmeB9/7M7IWr8ebroJnngCjjsu1lEZk7iCOQCQBlxReKArVc0Vkb4lrSwirwN9gW2qero3rS3wH6AasBb4naru9bPuWmAfbiTG7GDHEy6L2reH//3PHdN33ZaZkmza5No+Jk50tboZM9zIhMaY2Arm0FalwklERJ4EUNUVAaw/BuhdaNprwFBVbQO8D9xXzPrnqWq7eEgi4DoH3LXLdRhoipeT405OaNUKPvrIDTC1aJElEWPKimASyYV+pl0U6MqqOh3YVWhyC2C693gqcGUQ8ZRr7du7ezu8VbwlS1zCuPVW6NIFli2DBx6wIW6NKUtKTCQiMkRElgItRGSJz+1nYEmI+18GXOI9vgpoWMRyCnwuIgtE5MYQ91kmtGnjDmktWhTrSMqmzEzXH1bHjrBmjetg8fPP7cp0Y8qiQNpI3gU+AR4HhvpM36eqhWsYwfoD8LyIPAhMBo4UsdzZqrpJROoCU0VkpVfDOYaXaG4EaNSoUYjhhWbkyJFFzqtWDZo3txqJP59+CkOGwNq1boz0p56C44+PdVTGmKKUmEhUdQ+wBxgY7p2r6kqgF4CINAcuLmK5Td79NhF5H+hCwSGxwsuOAkYBdOrUKaYXTLYrYZSkdu1g9uwoBVMObNnirgd57z1o2RK++QbOPTfWURljShLIoa0Z3v0+Ednrc9snIsecYRUMr4aBdwrxMNwZXIWXqSoi1fMe4xLPslD2Gy1ffPEFX3zxRZHz27eHdetg9+4oBlUG5ebCK6+45DFpEjz8sKupWRIxpnwIpEbS3bsPqcciERkHpANpIrIRGA5UE5FbvUUmAW94y54IvKaqfYB6wPve0L4VgHdV9dNQYomWESNGAMeOlJgnr8KSkZG4gystW+auBZk1y5XBf/7jDvkZY8qPqHUkoapFHRp7zs+ym4A+3uM1QNsIhhYziZxIMjPhH/9w/WLVrAlvvAGDBtk1NcaUR8H0/vumiBzn87yWd5GhKaV69aB+/cQ7c+uzz9xZa0884Ya+XbkSBg+2JGJMeRXMdSRnqOqveU9UdTfQPvwhJZb27RPnzK0tW2DgQOjd23UT8/XXriaSlhbryIwxoQgmkST5jkciIrWxgbFC1r49fP89HDoU60gix19j+uLFkJ4e68iMMeEQTCJ4BpglIhO951cBj4Y/pPjxyiuvlLhMu3auC5Dlywu6l48nS5e6xvTvvoPzz4eXX7bGdGPiTTDjkbyF68Jkq3e7QlXfjlRg8aBFixa0KGHkqryuUuKtneTAAfjLX6BDBzeA11tvwRdfWBIxJh4Fe2gqBRBclyUp4Q8nvnz00UcA9OvXr8hlmjZ1Q8HGUzvJlCmubyy7Mt2YxBDMWVt3AmNx3cnXBd4RkdsjFVg8eOaZZ3jmmWeKXSYpyR3eiocayaZNMGAAXHwxVK7srkwfPdqSiDHxLpjG9j8CZ6rqcFV9EOgK/CkyYSWWbt1g3jzYty/WkZROTo4bM71lS5g8GUaMsCvTjUkkwSQSwQ0slSfHm2ZC1KcPZGW5NoTyZtEi6NoVbr/d3S9bBn/7m3XzbkwiCSaRvAHMEZGHROQhYDYwOiJRJZizzoIaNVzbQnmxb5/rYLFTJzfk7bvvugsNrZt3YxJPwI3tqvqsiHwDnI2riVyvqnFwZD/2UlKgVy+XSMr60Luq8OGHrgaycaM7tffxx6FWrZLXNcbEp6DO2lLVBcCCCMUSd95+O/Czo/v0cWORL1kCbctoz2Lr1rkE8tFHcMYZMGGCa98xxiS2EhOJiOzDne4LBaf+5j9W1RoRiq3ca9iwqAEfj9XbG81+ypSyl0iysmDkSHjoIff8n/+EO+90NSljjCmxjURVq6tqDe92zONoBFlejR8/nvHjxwe0bP367uK9stZO8t137or7+++Hnj1ddy733mtJxBhTIJjrSERErhWRv3vPG4pIl8iFVv69/PLLvPzyywEv36ePG5ejLAx0tXu3a/846yz3eNIk1zbSuHGsIzPGlDXBnLX1EtAN+K33fD/wYtgjSmB9+rgODj//PHYxqMLYse6akNGj4e67YcUKuPzysn0SgDEmdoJJJGeq6q3AIcjvRt6uFgijLl2gdu3YHd5atQouuMCNEdK0KcyfD888A9WqxSYeY0z5EEwiyRKRZLzGdhGpA+RGJKoElZzsGt0/+cTVTKLl0CEYPtydibVggeuhd+bMghEcjTGmOMEkkueB94G6IvIoMAN4LCJRJbCLL4bt292gT9Hw+edutMJHHoErr3SjFd58s0tqxhgTiEBO/30BeFdVx4rIAqAn7tTfy1R1RaQDLM8mTpxY8kKFXHEFnHACPPaYO0sqUrZscVemv/ceNGsGU6e6w1rGGBOsQGokPwLPiMha4Hpgpqq+EGwSEZHXRWSbiCzzmdZWRL4TkaUi8pGI+D2dWER6i8gqEVktIkOD2W8spaWlkRbkOLKpqXDfffDVV+4MrnDLyYEXX4QWLdyZWMOHu4sgLYkYY0orkOtInlPVbkAPYBfwhoisEJEHRSSYYYrGAL0LTXsNGKqqbXCHze4rvJLXLvMicBHQGhgoIq2D2G/MjBkzhjFjxgS93k03uXHM//GP8MazYIG7Ev2221zD/tKl7iLD1NTw7scYk1iCGSFxnao+qartcacAXw4EXCtR1em4ROSrBTDdezwVNwJjYV2A1aq6RlWPAO8Blwa631gqbSKpWhXuuQc+/dR1Lx+qPXvgjjtc8li/3p3e+/nnNlqhMSY8grkgMUVE+onIWOAT4Af8//AHYxlwiff4KsBfnyInARt8nm/0psW1W25xHSGOGFH6bajC+PHQqpUbL2TIENeY/tvf2jUhxpjwKTGRiMiFIvI67gf8RmAKcIqqXq2qH4S4/z8At3qN+NWBI/5C8DNN/UzLi/dGEZkvIvO3b98eYnixU6OG689q8mRYvDj49X/8EX7zG7jmGtf9ypw5Lpkcd1z4YzXGJLZAaiQPAN8BrVS1n6qOVdUD4di5qq5U1V6q2hEYB/zkZ7GNHF1TaQBsKmabo1S1k6p2qlOnTjjCjJk77oCaNeHqq90wtoE4fNidytumDcyeDc8/D3PnQufOkY3VGJO4AmlsP09VX1XVwu0bIRORut59EjAM+I+fxeYBzUSkqYhUBK4BJoc7lrKoVi3XZfsvv0B6ursvzrRprufg4cPhssvcYazbb7drQowxkRXMBYkhEZFxuJpNCxHZKCJ/xJ2B9QOwElfLeMNb9kQRmQKgqtnAbcBnuMb9Caq6PFpxh2LKlClMCbG/k3POcSMPbtkCPXrAhg1Hz1d1V6EPHAjnnee6fP/0U3d9yIknhrRrY4wJiKgW2dxQ7nXq1Ennz58f6zDCYvZs1+Zx5IirdbRv7y5cHD/edapYrZo7FDZsGFSuHOtojTHllYgsUNVOwawT1AiJJjgvvfQSALfcckvI2+ra1dU8Ro+GRYvcGOl797rpo0eIvI1QAAAgAElEQVTDgAHWuaIxJjasRhJB6enpAEybNi3s21aFX3+1sdKNMeFVmhpJ1NpITHiJWBIxxpQNlkiMMcaExBKJMcaYkFgiMcYYE5K4bmwXkX3AqljHUUakATtiHUQZYOVQwMqigJVFgRaqWj2YFeL99N9VwZ59EK9EZL6VhZWDLyuLAlYWBUQk6FNd7dCWMcaYkFgiMcYYE5J4TySjYh1AGWJl4Vg5FLCyKGBlUSDosojrxnZjjDGRF+81EmOMMRFmicQYY0xI4jKRiEhvEVklIqtFZGis44kmEXldRLaJyDKfabVFZKqI/OjdJ0QvXSLSUES+FpEVIrJcRO70pidceYhIqojMFZHFXlk87E1vKiJzvLIY7w0elxBEJFlEFonIx97zhCwLEVkrIktFJCPv1N9gvyNxl0hEJBl4EbgIaI0bPKt1bKOKqjFA70LThgJfqmoz4EvveSLIBu5R1VZAV+BW77OQiOVxGDhfVdsC7YDeItIVeBL4l1cWu4E/xjDGaLsTN1henkQui/NUtZ3PtTRBfUfiLpEAXYDVqrpGVY8A7wGXxjimqFHV6UDhYZEvBd70Hr8JXBbVoGJEVTer6kLv8T7cj8ZJJGB5qLPfe5ri3RQ4H5joTU+IsgAQkQbAxcBr3nMhQcuiCEF9R+IxkZwE+A5Iu9GblsjqqepmcD+uQN0YxxN1ItIEaA/MIUHLwzuUkwFsA6YCPwG/esNZQ2J9V0YC9wO53vPjSdyyUOBzEVkgIjd604L6jsRjFyniZ5qd45zARKQa8D/gLlXd6/58Jh5VzQHaichxwPtAK3+LRTeq6BORvsA2VV0gIul5k/0sGvdl4TlbVTeJSF1gqoisDHYD8Vgj2Qg09HneANgUo1jKiq0iUh/Au98W43iiRkRScElkrKpO8iYnbHkAqOqvwDRcu9FxIpL3hzJRvitnA5eIyFrcoe/zcTWURCwLVHWTd78N9wejC0F+R+IxkcwDmnlnYFQErgEmxzimWJsMDPIeDwI+jGEsUeMd9x4NrFDVZ31mJVx5iEgdryaCiFQGLsC1GX0N9PcWS4iyUNW/qmoDVW2C+334SlV/RwKWhYhUFZHqeY+BXsAygvyOxOWV7SLSB/cPIxl4XVUfjXFIUSMi44B0XLfYW4HhwAfABKARsB64SlULN8jHHRHpDnwLLKXgWPgDuHaShCoPETkD12iajPsDOUFVHxGRk3H/ymsDi4BrVfVw7CKNLu/Q1r2q2jcRy8J7ze97TysA76rqoyJyPEF8R+IykRhjjImemB/aKuqisULLiIg8711guEREOsQiVmOMMccqC2dt5V00ttA7VrdARKaq6vc+y1wENPNuZwIve/fGGGNiLOY1kmIuGvN1KfCWd1HVbNzZFfWjHKoxxhg/ykKNJF+hi8Z8FXWR4WY/27gRuBGgatWqHVu2bBmJUAOyapUbLr5FixYxi8EYY4KxYMGCHapaJ5h1ykwiKXzRWOHZflbxe5aAqo7CG5ilU6dOOn9+0MMPh016ejoA06ZNi1kMxhgTDBFZF+w6MT+0BUVeNObLLjI0xpgyKuY1kmIuGvM1GbhNRN7DNbLvyesHpizr27dvrEMwxpiIi3kiwXVXcB2w1OtQDtxFY40AVPU/wBSgD7AayASuj0GcQbv33ntjHYIxxkRczBOJqs7AfxuI7zIK3BqdiIwxxgSjTLSRxKv09PT8BndjjIlXlkiMMcaExBKJMcaYkFgiMcYYExJLJMaYhLNlyxauueYaTjnlFFq3bk2fPn344YcfYh1WQJo0acKOHTsCXn7MmDHcdtttEYyoDJy1Fc8GDBgQ6xCMMYWoKpdffjmDBg3ivffeAyAjI4OtW7fSvHnzGEdXPlmNJIJuueUWbrnllliHYYzx8fXXX5OSksLNN9+cP61du3Z0796d++67j9NPP502bdowfvx4wHVx1KNHDwYMGEDz5s0ZOnQoY8eOpUuXLrRp04affvoJgMGDBzNkyBDOO+88Tj75ZL755hv+8Ic/0KpVKwYPHpy/ryFDhtCpUydOO+00hg8fnj+9SZMmDB8+nA4dOtCmTRtWrnRDp+/cuZNevXrRvn17brrpJnzHkHrnnXfo0qUL7dq146abbiInJweAN954g+bNm9OjRw9mzpwZsbLMY4kkgjIzM8nMzIx1GMaUbenpx95eesnNy8z0P3/MGDd/x45j55Vg2bJldOzY8ZjpkyZNIiMjg8WLF/PFF19w3333sXmz60Bj8eLFPPfccyxdupS3336bH374gblz53LDDTfw73//O38bu3fv5quvvuJf//oX/fr1489//jPLly9n6dKlZGS4660fffRR5s+fz5IlS/jmm29YsmRJ/vppaWksXLiQIUOG8PTTTwPw8MMP0717dxYtWsQll1zC+vXrAVixYgXjx49n5syZZGRkkJyczNixY9m8eTPDhw9n5syZTJ06le+/9x2RIzIskURQnz596NOnT6zDMMYEYMaMGQwcOJDk5GTq1atHjx49mDdvHgCdO3emfv36VKpUiVNOOYVevXoB0KZNG9auXZu/jX79+iEitGnThnr16tGmTRuSkpI47bTT8pebMGECHTp0oH379ixfvvyoH/orrrgCgI4dO+YvP336dK699loALr74YmrVqgXAl19+yYIFC+jcuTPt2rXjyy+/ZM2aNcyZM4f09HTq1KlDxYoVufrqqyNZbIC1kRhjYq243rGrVCl+flpa8fP9OO2005g4ceIx04sbdrxSpUr5j5OSkvKfJyUlkZ2dfcxyvsv4Lvfzzz/z9NNPM2/ePGrVqsXgwYM5dOjQMesnJycftV3XJeGx8Q4aNIjHH3/8qOkffPCB3+UjyWokxpiEcv7553P48GFeffXV/Gl5P+zjx48nJyeH7du3M336dLp06RLWfe/du5eqVatSs2ZNtm7dyieffFLiOueeey5jx44F4JNPPmH37t0A9OzZk4kTJ7Jt2zYAdu3axbp16zjzzDOZNm0aO3fuJCsri//+979hfQ3+WI3EGJNQRIT333+fu+66iyeeeILU1FSaNGnCyJEj2b9/P23btkVEeOqppzjhhBPyG73DoW3btrRv357TTjuNk08+mbPPPrvEdYYPH87AgQPp0KEDPXr0oFGjRgC0bt2aESNG0KtXL3Jzc0lJSeHFF1+ka9euPPTQQ3Tr1o369evToUOH/Eb4SJHiqnPlnQ1sZYwxwRGRBaraKZh1rEYSQb6n/BljTLyyRBJBlkiMMYmgTDS2i8jrIrJNRJYVMT9d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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure()\n",
    "plt.suptitle('Cruise control with integrator anti-windup protection')\n",
    "t, y = ct.input_output_response(\n",
    "    cruise_pi, T, [vref, gear, theta_hill], X0,\n",
    "    params={'kaw':2.})\n",
    "cruise_plot(cruise_pi, t, y, antiwindup=True);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
